#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int N=200050;
const int INF=0x3f3f3f3f;
int n,m;
char q[3];
int a,b;
struct node{
    int l;
    int r;
    int Max;
}tree[4*N];
void build(int k,int ll,int rr){
    tree[k].l=ll;
    tree[k].r=rr;
    if(tree[k].l==tree[k].r){
        scanf("%d",&tree[k].Max);
        return;
    }
    int m=(ll+rr)/2;
    build(k*2,ll,m);
    build(k*2+1,m+1,rr);
    tree[k].Max=max(tree[k*2].Max,tree[k*2+1].Max);
}
inline int change_point(int k,int x,int y){
	if(x<tree[k].l || x>tree[k].r){
		return tree[k].Max;
	}
    if(tree[k].l==x && tree[k].r==x){
        return tree[k].Max=y;
    }
    int _a=change_point(k*2,x,y);

    int _b=change_point(k*2+1,x,y);
    return tree[k].Max=max(_a,_b);
}
inline int ask(int k,int a,int b){
	if(tree[k].l>b|| tree[k].r<a){
		return 0;
	}
    if(tree[k].l>=a && tree[k].r<=b){
        return tree[k].Max;
    }
    int _a=ask(k*2, a,b);
    int _b=ask(k*2+1,a,b);
	return max(_a,_b);
}
int main(void){
    //freopen("data.txt","r",stdin);
    while(scanf("%d%d",&n,&m)!=EOF){
        for(int i=0;i<4*N;i++){
            tree[i].l=0;
            tree[i].r=0;
            tree[i].Max=0;
        }
        build(1,1,n);
        while(m--){
            scanf("%s%d%d",q,&a,&b);
            if(q[0]=='Q'){
                printf("%d\n",ask(1,a,b));
            }
            else{
                change_point(1,a,b);
            }
        }
    }
    return 0;
}